在前面二十幾天的介紹,我似乎忘了很重要的一個物件 Namespac。
k8s 使用 namespaces 來管理資源,以此作為資源隔離的方法。我們也可以透過 namespace 將其叢集劃分成不同的虛擬子叢集。
namespaces 僅適用於 pods、deployment 與 services 等 namespaces 物件,不適用於 cluster-wide(叢集範圍)物件,如 persisten volume 與 node。
查詢不適用 namespaces 的資源:
kubectl api-resources --namespaced=false。
查詢適用 namespace 的資源:kubectl api-resources --namespaced=true。
查看叢集中的 namespaces。
kubectl get ns
NAME              STATUS   AGE
default           Active   20d
kube-node-lease   Active   20d
kube-public       Active   20d
kube-system       Active   20d
叢集一開始就有四個預設的 namespaces:
kube-system:主要用於 k8s 建立的系統程序與物件,一般不會去動到這個 namespace 的物件。kube-pulic:所有使用者皆可存取該 namespace 的資源。kube-node-lease:主要是與 node 相關的 lease object,lease object 用於定期監控節點狀態。default:若沒有建立新的 namespace,一開始建立的資源其 namespace 自動設為 default。建立 namespaces 有兩種方式:
建立一個 namespace 為 develop。
kubectl create namespace develop
kubectl get ns
NAME              STATUS   AGE
default           Active   20d
develop           Active   4s
kube-node-lease   Active   20d
kube-public       Active   20d
kube-system       Active   20d
以下為 ns-develop.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: develop
  labels:
    name: develop
執行以下指令建立 namespace。
kubectl create -f ns-develop.yaml
以下建立一個 image 為 nginx 的 pod 並設定 namespace 為 develop。
kubectl run nginx --image=nginx --namespace=develop
pod/nginx created
或是在 pod.yaml 中註明其 namespace。
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: develop
spec:
  containers:
  - image: nginx
    name: nginx
建立 namespace。
kubectl create -f pod.yaml
pod/nginx created
查看該資源。
kubectl get po -n develop
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          70s
執行以下指令。
kubectl delete ns develop
namespace "develop" deleted
因每次查看 namespaces 中的資源其指令都需要填上 -n namespace-name,我們可以透過以下指令將後續的情境(context)都設定在某 namespace 上,就不需要每次指令都要填上 -n 參數。
kubectl config set-context --current --namespace=develop
Context "minikube" modified.
測試一下。
kubectl config view --minify | grep namespace:
    namespace: develop
查看該 pod 的 namespace。
kubectl get pod nginx -o yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2023-10-12T15:45:23Z"
  name: nginx
  namespace: develop
  resourceVersion: "65133"
  ...